package com.common;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class SetCharacterEncodingFilter implements Filter
{
	protected String encoding = null;
	protected FilterConfig filterConfig = null;
	protected boolean ignore = true;
	
	public void destroy()
	{
		this.encoding = null;
		this.filterConfig = null;
	}
	
	/**
	 * Select and set (if specified) the character encoding to be used to interpret request parameters for this request.
	 * @param request: The servlet request we are processing
	 * @param result: The servlet response we are creating
	 * @param chain: The filter chain we are processing
	 * @exception IOException: if an input/output error occurs
	 * @exception ServletException: if a servlet error occurs
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
	{
		// Conditionally select and set the character encoding to be used
		if (ignore || (request.getCharacterEncoding() == null))
		{
			String encoding = selectEncoding(request);
			
			if (encoding != null)
			{
				request.setCharacterEncoding(encoding);
			}
		}
		
		// Pass control on to the next filter
		chain.doFilter(request, response);
	}
	
	/**
	 * Place this filter into service
	 * @param filterConfig: The filter configuration object
	 */
	public void init(FilterConfig filterConfig) throws ServletException
	{
		this.filterConfig = filterConfig;
		this.encoding = filterConfig.getInitParameter("encoding");
		String value = filterConfig.getInitParameter("ignore");
		
		if(value == null)
		{
			this.ignore = true;
		}
		else if(value.equalsIgnoreCase("true"))
		{
			this.ignore = true;
		}
		else if(value.equalsIgnoreCase("yes"))
		{
			this.ignore = true;
		}
		else
		{
			this.ignore = false;
		}
	}
	
	protected String selectEncoding(ServletRequest request)
	{
		return (this.encoding);
	}
}
